package com.rui.iterator.main;

import com.rui.iterator.model.Aggregate;
import com.rui.iterator.model.AggregateImpl;
import com.rui.iterator.model.Iterator;

import java.util.ArrayList;
import java.util.List;

/**
 * 迭代器模式（Iterator Pattern）
 * <p>
 * <p>
 * 迭代器模式又称为游标模式（Cursor Pattern），它提供一种顺序访问集合/容器对象元素的方法，而又无须暴露结合内部表示。
 * 本质：抽离集合对象迭代行为到迭代器中，提供一致访问接口。
 * <p>
 * 迭代器模式主要包含以下角色：
 * 抽象聚合（Aggregate）角色：定义存储、添加、删除聚合元素以及创建迭代器对象的接口。
 * 具体聚合（ConcreteAggregate）角色：实现抽象聚合类，返回一个具体迭代器的实例。
 * 抽象迭代器（Iterator）角色：定义访问和遍历聚合元素的接口，通常包含 hasNext()、next() 等方法。
 * 具体迭代器（Concretelterator）角色：实现抽象迭代器接口中所定义的方法，完成对聚合对象的遍历，记录遍历的当前位置。
 * <p>
 * <p>
 * 适用场景：
 * 访问一个集合对象的内容而无需暴露它的内部表示。
 * 为遍历不同的集合结构提供一个统一的访问接口。
 * <p>
 * 优点：
 * 多态迭代：为不同的聚合结构提供一致的遍历接口，即一个迭代接口可以访问不同的聚集对象。
 * 简化集合对象接口：迭代器模式将集合对象本身应该提供的元素迭代接口抽取到了迭代器中，使集合对象无须关心具体迭代行为。
 * 元素迭代功能多样化：每个集合对象都可以提供一个或多个不同的迭代器，使的同种元素聚合结构可以有不同的迭代行为。
 * 解耦迭代与集合：迭代器模式封装了具体的迭代算法，迭代算法的变化，不会影响到集合对象的架构。
 * <p>
 * 缺点：
 * 对于比较简单的遍历（像数组或者有序列表），使用迭代器方式遍历较为繁琐。
 * 增加了类的个数，在一定程度上增加了系统的复杂性。
 *
 * @author ZhangRui
 * @date 2023/03/03 16:43
 **/
public class Main {

    public static void main(String[] args) {
        List<String> list = new ArrayList<>();

        Aggregate aggregate = new AggregateImpl();
        for (int i = 0; i < 10; i++) {
            aggregate.add(i);
        }


        Iterator iterator = aggregate.iterator();
        while (iterator.hasNext()) {
            System.out.println(iterator.next());
        }
    }
}
